﻿/*-------------------------------------------------------------------------
* 命名空间: PrismRegionSimple/StackPanelRegionAdapter
* 类       名: StackPanelRegionAdapter
* 功      能:  TD
* 时      间:  2023/12/20 14:20:24
* 版      本:  V1.0
* 作      者:  Fioman
* 格      言:  Talk is cheap,show me the code ^_^
*-------------------------------------------------------------------------*/
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;

namespace PrismRegionSimple
{
    public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>
    {
        public StackPanelRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory) : base(regionBehaviorFactory)
        {
        }

        /// <summary>
        /// 将region和具体的region控件进行关联,当View发生改变的时候,往regionTarget中添加对应的
        /// 控件. e.Action == System.Collections.Specialized.NotifyCollectionChangeAction.Add的判断条件是用来检测
        /// 结合中是否有新的元素被添加.System.Collections.Specialized.NotifyCollectionChangedAction.Add表示集合发生了添加操作.
        /// Adapt方法通常在区域管理器尝将一个控件(在这个例子中是StackPanel)附加到一个区域时调用.在这个过程中,它会使用RegionAdapterMappings来
        /// 找到一个适配器来适配这个控件.
        /// region.Views.CollectionChanged事件在region.Views集合(也就是区域中的视图集合)发生变化时触发.这个变化可能是添加,删除,移除或者替换视图,
        /// 或者是刷新整个集合.在这段代码中,我们只关心删除操作,所以只有在新的视图被添加到区域中时,这个事件处理器才会执行对应的操作.
        /// </summary>
        /// <param name="region"></param>
        /// <param name="regionTarget"></param>
        protected override void Adapt(IRegion region, StackPanel regionTarget)
        {
            region.Views.CollectionChanged += (sender, e) =>
            {
                if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
                {
                    foreach (var item in e.NewItems!)
                    {
                        regionTarget.Children.Add((FrameworkElement)item);
                    }
                }
            };
        }

        /*
         * 返回一个Region实例,一般在XAML中使用RegionManager.RegionName=""的时候,会调用这个函数
         * 来返回一个Region实例,并且赋值名称为RegionName后面跟的名字.
         */
        protected override IRegion CreateRegion()
        {
            return new Region();
        }
    }
}
